home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
qa
/
src
/
qa.c
< prev
Wrap
C/C++ Source or Header
|
1993-07-08
|
9KB
|
345 lines
// Q&A(FMTOWNS版) ///// Tab Size : 4 /////
// ///// Margin : 120 /////
// QA06.c v1.0 L17
//
// (C)K.Konishi 11-Feb-93
//
#define MAIN
#include "Platform.h"
#include <EGB.h>
#include <MOS.h>
#include "aoi_lib1.h"
#include <CDRFRB.h>
#include "cd.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <FMCFRB.h>
#include <msdos.cf>
AOIbuttonData AbD[BUTTON];
#define KeyESC 0x1b
#define Key1 0x31
#define Key9 0x39
#define KeyA 0x41
#define KeyZ 0x5A
#define Keya 0x61
#define Keyz 0x7A
#define FontSX 12
#define FontSY 12
#define FontAX 6
#define FontAY 12
#define INIT_X 250
#define INIT_Y 150
#define BUTTON_X 16
#define BUTTON_Y 16
#define BUTTON_FX BUTTON_X + 1
#define BUTTON_FY BUTTON_Y + 1
#define WIN_FRAME 5
#define WIN_FRAMEx2 (WIN_FRAME << 1)
enum {MENU, CONSOLE, TOWNS, CDPLAYER, HIGH, LOW, CDPLAY};
void AKANEmessage(void)
{
puts("Q&A V1.0 (c)1992 KUNIZO KONISHI\n");
puts("run386 QA -[オプション] [質問] [選択肢1]・・・・・・\n");
puts(" -m : TownsMENU上で選択する");
puts(" -c : コンソール上で選択する");
// puts("\nrun386 QA -[オプション] -nD(画面非表示)\n");
// puts(" -towns : FMTOWNSの機種を判別する");
puts(" -high : 高速モードを設定する");
puts(" -low : 互換モードを設定する");
// puts(" -cdplay : CDPLAYER");
}
void AKANEbaseDraw(short sx, short sy, short lx, short ly, short bx, short by)
{
AOIwinBase(sx, sy, lx, ly, 1);
AOIbuttonBase(sx + 5, sy + 5, bx, by);
AOIbuttonBase(sx + 22, sy + 5, lx - 27, by);
AOIsetButton(&AbD[1], WIN_FRAME, WIN_FRAME, BUTTON_X, BUTTON_Y); // 終了
AOIsetButton(&AbD[2], WIN_FRAME + BUTTON_X, WIN_FRAME, lx - WIN_FRAMEx2 - BUTTON_X , BUTTON_Y); // 移動
}
void AKANEbuttonSet(short sx, short sy, short lx, short fs, char *argv[], short argvLen[], int a)
{
short i;
AOIstringData asD; // AOIstrData型の変数宣言
asD.sx = FontSX;
asD.sy = FontSY;
asD.ax = FontAX;
asD.ay = FontAY;
asD.sc = BLACK;
asD.ss = fs;
AOIstring(sx + WIN_FRAME + (lx >> 1) - argvLen[2] * (FontAX >> 1), sy + 2 + BUTTON_FY, &asD, argv[2]);
if (a != 0) {
for (i = 3; i < a + 3; i++) {
AOIbuttonBase(sx + WIN_FRAME, sy + WIN_FRAME + (i - 2) * BUTTON_FY, lx - WIN_FRAMEx2, BUTTON_Y - 1);
AOIsetButton(&AbD[i], WIN_FRAME, WIN_FRAME + (i - 2) * BUTTON_FY, lx - WIN_FRAMEx2, BUTTON_Y - 1);
AOIstring(sx + WIN_FRAME + (lx >> 1) - argvLen[i] * (FontAX >> 1), sy + 2 + (i - 1) * BUTTON_FY,
&asD, argv[i]);
}
}
}
void AKANEgraphInit(void)
{
int page, dpage, pri;
EGB_resolution(work, 0, 0x43); // グラフィック仮想画面の設定
EGB_resolution(work, 1, 0x43); // グラフィック仮想画面の設定
page = EGB_getWritePage(0, 0); // 書き込みページの読み取り
EGB_writePage(work, page | 0x40); // グラフィック書き込みページ
EGB_getDisplayPage(&dpage, &pri); // 表示ページの読み取り
EGB_displayPage(work, dpage, pri); // グラフィック表示ページの指定
}
void AKANEmouseInit(void)
{
MOS_start(mwork, MosWorkSize);
MOS_typeRom(80 + 1, 0, 0, pat_work);
MOS_disp(1);
}
short AKANEmouseWork(short *retNum, int argc, char *argv[]) // TownsMENU上での操作
{
short j, dmyLen = 0;
short lx, ly;
short fs = 0x00;
short argvLen[11];
int ch, mx, my;
int button = 0;
char endmark = 0;
char buttonLamp = OFF;
short sx = INIT_X, sy = INIT_Y;
short bx = BUTTON_X, by = BUTTON_Y;
unsigned moji, encode;
char dispTmp[(640/8)*480]; // ドットデータの読み書き作業領域
if (argc < 3) { // パラメータの数をチェック
AKANEmessage();
*retNum = FALSE;
return FALSE;
}
// lx, ly を決める
for (j = 2; j < argc; j++) if (dmyLen < (argvLen[j] = strlen(argv[j]))) dmyLen = argvLen[j];
lx = WIN_FRAMEx2 + dmyLen * FontAX + 60;
ly = WIN_FRAMEx2 + (argc - 2) * BUTTON_FY - 1;
// fs (フォントスタイル)を決める
if (!_strcmpi(argv[1], "-m0") || !_strcmpi(argv[1], "-m")) fs = 0x00;
if (!_strcmpi(argv[1], "-m1")) fs = 0x01;
if (!_strcmpi(argv[1], "-m2")) fs = 0x02;
AKANEgraphInit(); // グラッフィクスの初期化
AOIgetGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
AKANEbaseDraw(sx, sy, lx, ly, bx, by); // ウインドゥ描画
AKANEbuttonSet(sx, sy, lx, fs, argv, argvLen, argc - 3);
AKANEmouseInit(); // マウスの初期化
do {
MOS_rdpos(&ch, &mx, &my);
button = 0;
if (ch == 1) button = AOIbutton(sx, sy, mx, my, AbD); // マウスの入力
moji = KYB_read(1, &encode); // キーボートの入力
switch (moji) {
case KeyESC : // ESC
button = 1;
break;
case Key1..Key9 : // 1~9
button = moji - 46;
if (argc - 3 < button - 2) button = 0;
break;
case KeyA..KeyZ : // A~Z
button = moji - 55;
if (argc - 3 < button - 2) button = 0;
break;
case Keya..Keyz : // a~z
button = moji - 87;
if (argc - 3 < button - 2) button = 0;
break;
}
KYB_clrbuf();
if (button > 0) { // ボタン反転
if (button != 18 && button != 19 && button != 20) {
AOIbuttonLamp(sx, sy, &AbD[button]);
buttonLamp = ON;
MOS_typeRom(115 + 1, 0, 0, pat_work); // マウスも変更
if (button == 1) {
MOS_typeRom(124 + 1, 0, 0, pat_work);
}
}
}
switch (button) {
case 1 :
endmark = 1; // 終了条件設定
*retNum = FALSE;
break;
case 2 : // 移動
AOIwindowMove(dispTmp, &sx, &sy, lx, ly);
break;
case 3..20 :
endmark = 1; // 値を返す
*retNum = button - 2;
break;
}
if (buttonLamp == ON) { // ボタンの反転
if (button > 0) {
AOIbuttonLamp(sx, sy, &AbD[button]);
buttonLamp = OFF;
MOS_typeRom(80 + 1, 0, 0, pat_work); // マウスも元通り
}
}
} while (endmark != 1);
MOS_end();
AOIputGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
}
short AKANEconsoleWork(short *retNum, int argc, char *argv[]) // コンソール上での選択
{
unsigned moji, encode;
int button = 0;
char endmark = 0;
short item = 0;
if (argc < 3) { // パラメータの数をチェック
AKANEmessage();
*retNum = FALSE;
return FALSE;
}
printf("%s\n\n", argv[2]); // 質問の表示
for (item = 3; item < argc; item++) printf(" %d. %s\n", item - 2, argv[item]); // 選択肢の表示
if (item == 4) printf("\n何かキーを押してください\n");
else printf("\n1 ~ %d の中から選んでください", item - 3);
do {
button = 0;
moji = KYB_read(1, &encode);
switch (moji) {
case KeyESC : // ESC
button = 1;
break;
case Key1..Key9 : // 1~9
button = moji - 46;
if (item - 3 < button - 2) button = 0;
break;
case KeyA..KeyZ : // A~Z
button = moji - 55;
if (item - 3 < button - 2) button = 0;
break;
case Keya..Keyz : // a~z
button = moji - 87;
if (item - 3 < button - 2) button = 0;
break;
}
KYB_clrbuf();
switch (button) {
case 1 :
endmark = 1; // 終了条件設定
*retNum = FALSE;
break;
case 3..20 :
endmark = 1; // 値を返す
*retNum = button - 2;
break;
default :
printf("\r1 ~ %d の中から選んでください", item - 3);
}
} while (endmark != 1);
printf("\n");
}
void AKANEtownsWork(short *retNum, char *argv[]) // TOWNS機種判別
{
char *machine[] = {"", "初代", "2代目", "3代目", "IIUX", "IICX"};
short m;
m = AOItownsName();
if (_strcmpi(argv[2], "-nD")) {
if (m == 0) printf("わかりません\n");
else printf("このTOWNSは %s です\n", machine[m]);
}
*retNum = m;
return;
}
void AKANEmodeWork(short *retNum, char *argv[], BYTE mode) // IICXのモード設定
{
short m;
m = AOItownsName();
if (_strcmpi(argv[2], "-nD")) {
if (1 <= m && m <= 4) {
printf("このTOWNSは%sモードを設定できません\n", (mode == HIGH) ? "高速" : "互換");
} else {
printf("%sモードに設定しました\n", (mode == HIGH) ? "高速" : "互換");
}
}
outp(0x05ec, (mode == HIGH) ? 1 : 0);
*retNum = TRUE;
return;
}
short StartingFunction(int argc, char *argv[])
{
BYTE inputer;
short retNum;
if (argc < 2) {
AKANEmessage();
return FALSE;
}
if (!strnicmp(argv[1], "-m", 2)) { // -m -m1 -m2・・・ の場合
inputer = MENU;
} else if (!_strcmpi(argv[1], "-c")) {
inputer = CONSOLE;
} else if (!_strcmpi(argv[1], "-towns")) {
inputer = TOWNS;
} else if (!_strcmpi(argv[1], "-high")) {
inputer = HIGH;
} else if (!_strcmpi(argv[1], "-low")) {
inputer = LOW;
} else if (!_strcmpi(argv[1], "-cdplay")) {
inputer = CDPLAY;
} else {
AKANEmessage();
return FALSE;
}
if (inputer == MENU) { // TMENU(-m)のときの処理
AKANEmouseWork(&retNum, argc, argv);
}
if (inputer == CONSOLE) { // コンソール(-c)のときの処理
AKANEconsoleWork(&retNum, argc, argv);
}
if (inputer == TOWNS) { // TOWNS機種判別(-towns)のときの処理
AKANEtownsWork(&retNum, argv);
}
if (inputer == HIGH) { // IICXの高速モード設定(-high)のときの処理
AKANEmodeWork(&retNum, argv, HIGH);
}
if (inputer == LOW) { // IICXの互換モード設定(-low)のときの処理
AKANEmodeWork(&retNum, argv, LOW);
}
if (inputer == CDPLAY) { // CDPLAYER(-cdplay)のときの処理
extern AKANEcdplayWork(void);
retNum = AKANEcdplayWork();
}
return retNum;
}
short main(int argc, char *argv[])
{
return StartingFunction(argc, argv);
}